/*
 * turn_signal.c
 *
 *  Created on: 15-03-2013
 *      Author: MCzepczyński
 */

/******************************************************************************************
 *	Deklaracje dołączanych plików nagłówkowych i bibliotek								 *
 *****************************************************************************************/
#include "turn_signal.h"

volatile uint16_t turn_timer;

/******************************************************************************************
 *	Deklaracje funkcji															 		 *
 *****************************************************************************************/

/*
 * 	Funkcja sprawdzająca stan kierunkowskazow (lewy/prawy)
 *  Wynik: 0 - kierunkowskazy wylaczone
 *         1 - lewy kierunkowskaz zalaczony
 *         2 - prawy kierunkowskaz zalaczony
 */
uint8_t check_turn_signals(void){
	if(!(TURN_LEFT_PIN & TURN_LEFT)){
		return 1;								// lewy kierunkowskaz załączony
	} else if(!(TURN_RIGHT_PIN & TURN_RIGHT)){
		return 2;								// prawy kierunkowskaz załaczony
	} else{
		return 0;								// zaden z kierunkowskazow nie załaczony
	}
}/* check_turn_signals */

/*
 * 	Funkcja realizujaca dzialanie kierunkowskazow (lewy/prawy)
 */
void turn_signals(void){
	static uint8_t turn_status = 0;
	uint8_t temp = 0;
	enum states {idle, delay, sustain, off, impulse};

	switch(turn_status){
		case idle:			temp = check_turn_signals();				// sprawdzenie stanu kierunkowskazow
							if(temp){									// jeli jakikolwiek jest wlaczony
								if(temp == 1){							// lewy kierunkowskaz zalaczony
									TURN_LEFT_RELAY_ON;
								} else{									// prawy kierunkowskaz zalaczony
									TURN_RIGHT_RELAY_ON;
								}

								turn_timer = TURN_RELAY_IMP_DELAY;	// odmierz czas impulsu manetki
								turn_status = delay;					// przejscie do procedury "delay"
							}
							break;

		case delay:			if(!turn_timer){						// minal czas impulsu manetki
								if(check_turn_signals() == 0){			// tryb impulsu
									turn_timer = TURN_RELAY_DELAY;	// odmierz czas pozostalych 3 mrugniec
									turn_status = impulse;				// przejscie do procedury "impulse"
								} else{									// tryb podtrzymania kierunkowskazu
									turn_status = sustain;				// przejscie do procedury "sustain"
								}
							}
							break;

		case sustain:		if(!check_turn_signals()){					// w trybie podtrzymania zwolniono manetke
								turn_status = off;						// przejscie do procedury "off"
							}
							break;

		case impulse:		if(check_turn_signals() != 0){				// w czasie odmierzania impulsu zmieniono kierunkowskaz
								turn_status = off;						// przejscie do procedury "off"
								break;
							}
							if(!turn_timer){						// minal czas 4 mrugniec kierunkowskazu
								turn_status = off;						// przejscie do procedury "off"
							}
							break;

		case off:			TURN_LEFT_RELAY_OFF;						// wylaczenie kierunkowskazu lewego
							TURN_RIGHT_RELAY_OFF;						// wylaczenie kierunkowskazu lewego
							turn_status = idle;							// przejscie do procedury "idle"
							break;
	}
}/* turn_signals */

/*
 * 	Funkcja realizująca normalną funkcję kierunkowskazow
 */
void turn_signals_default(void){
	if(!(TURN_LEFT_PIN & TURN_LEFT)){
		TURN_LEFT_RELAY_ON;
	} else {
		TURN_LEFT_RELAY_OFF;
	}

	if(!(TURN_RIGHT_PIN & TURN_RIGHT)){
		TURN_RIGHT_RELAY_ON;
	} else {
		TURN_RIGHT_RELAY_OFF;
	}
}/* turn_signals_default */

/******************************************************************************************
 *	Koniec pliku turn_signals.c
 *****************************************************************************************/
